#include <stdio.h>
#include <stdbool.h>

#define MEMORY_SIZE 4096  // 4KB 内存
#define BLOCK_SIZE 4      // 每个内存块大小（4B）
#define BLOCK_COUNT (MEMORY_SIZE / BLOCK_SIZE)

// 内存
typedef struct {
    // 字节数组
    unsigned char memory[MEMORY_SIZE];
    // block_used[i]：表示 i 号内存块是否被使用
    bool block_used[BLOCK_COUNT];
} Memory;

// 初始化内存
void mem_init(Memory *m) {
    for (int i = 0; i < BLOCK_COUNT; i++) {
        m->block_used[i] = false;
    }
}

// 分配内存块
void* mem_alloc(Memory *m) {
    for (int i = 0; i < BLOCK_COUNT; i++) {
        if (!m->block_used[i]) {
            m->block_used[i] = true;
            return &m->memory[i * BLOCK_SIZE];
        }
    }
    return NULL;  // 内存池已满
}

// 释放内存块
void mem_free(Memory *m, void *ptr) {
    if (ptr < &m->memory[0] || ptr >= &m->memory[MEMORY_SIZE]) {
        return;  // 无效指针
    }
    
    int block_index = ((unsigned char*)ptr - m->memory) / BLOCK_SIZE;
    if (block_index >= 0 && block_index < BLOCK_COUNT) {
        m->block_used[block_index] = false;
    }
}

// 获取可用内存块数量
int mem_available(Memory *m) {
    int count = 0;
    for (int i = 0; i < BLOCK_COUNT; i++) {
        if (!m->block_used[i]) {
            count++;
        }
    }
    return count;
}

// 示例使用
int main() {
    Memory m;
    mem_init(&m);
    
    void *block1 = mem_alloc(&m);
    void *block2 = mem_alloc(&m);
    
    printf("可用内存块: %d\n", mem_available(&m));  // 输出: 62
    
    mem_free(&m, block1);
    printf("可用内存块: %d\n", mem_available(&m));  // 输出: 63
    
    return 0;
}